package main

import (
	"fmt"
	"samber_demo/samber"
)

// 食用方法:
// 理解这个函数在干什么
// 意思到位就能封装自己的逻辑在这个类似小框架里面了
func main() {
	//catalogue() // 覆盖这里面的方法
	recommend() // 推荐的方法
}

func catalogue() {
	samber.Assign()
	samber.Associate()
	fmt.Printf("==========================\n")
	samber.Attempt()
	samber.AttemptWhile()
	samber.AttemptWhileWithDelay()
	samber.AttemptWithDelay()
	fmt.Printf("==========================\n")
	samber.Buffer()
	samber.BufferWithTimeout()
	fmt.Printf("==========================\n")
	// samber.ChannelDispatcher() // 这个我测试有点问题
	samber.Chunk()
	samber.ChunkString()
	samber.Clamp()
	samber.Coalesce()
	samber.Compact()
	samber.Contains()
	samber.ContainsBy()
	samber.Count()
	samber.CountBy()
	samber.CountValues()
	samber.CountValuesBy()
	fmt.Printf("==========================\n")
	samber.Difference()
	samber.DispatchingStrategyFirst()
	samber.DispatchingStrategyLeast()
	samber.DispatchingStrategyMost()
	samber.DispatchingStrategyRandom()
	samber.DispatchingStrategyRoundRobin()
	samber.Drop()
	samber.DropRight()
	samber.DropRightWhile()
	samber.DropWhile()
	fmt.Printf("==========================\n")
	samber.Empty()
	samber.EmptyableToPtr()
	samber.ErrorsAs()
	samber.Every()
	samber.EveryBy()
	fmt.Printf("==========================\n")
	samber.FanIn()
	samber.FanOut()
	samber.Fill()
	samber.Filter()
	samber.FilterMap()
	samber.Find()
	samber.FindDuplicates()
	samber.FindDuplicatesBy()
	samber.FindIndexOf()
	samber.FindKey()
	samber.FindLastIndexOf()
	samber.FindOrElse()
	samber.FindUniques()
	samber.FindUniquesBy()
	samber.FlatMap()
	samber.Flatten()
	samber.ForEach()
	samber.FromAnySlice()
	samber.FromEntries()
	samber.FromPairs()
	samber.FromPtr()
	samber.FromPtrOr()
	fmt.Printf("==========================\n")
	samber.GroupBy()
	fmt.Printf("==========================\n")
	samber.If()
	samber.IfF()
	samber.IndexOf()
	samber.Interleave()
	samber.Intersect()
	samber.Invert()
	samber.IsEmpty()
	samber.IsNotEmpty()
	samber.IsSorted()
	samber.IsSortedByKey()
	fmt.Printf("==========================\n")
	samber.KeyBy()
	samber.Keys()
	fmt.Printf("==========================\n")
	samber.Last()
	samber.LastIndexOf()
	fmt.Printf("==========================\n")
	samber.Map()
	samber.MapEntries()
	samber.MapKeys()
	samber.MapToSlice()
	samber.MapValues()
	samber.Max()
	samber.MaxBy()
	samber.Min()
	samber.MinBy()
	samber.Must()
	fmt.Printf("==========================\n")
	samber.NewDebounce()
	samber.NewDebounceBy()
	samber.None()
	samber.NoneBy()
	samber.Nth()
	fmt.Printf("==========================\n")
	samber.OmitBy()
	samber.OmitByKeys()
	samber.OmitByValues()
	fmt.Printf("==========================\n")
	samber.Partial()
	samber.PartitionBy()
	samber.PickBy()
	samber.PickByKeys()
	samber.PickByValues()
	fmt.Printf("==========================\n")
	samber.RandomString()
	samber.Range()
	samber.RangeFrom()
	samber.RangeWithSteps()
	samber.Reduce()
	samber.ReduceRight()
	samber.Reject()
	samber.Repeat()
	samber.RepeatBy()
	samber.Replace()
	samber.ReplaceAll()
	samber.Reverse()
	samber.RuneLength()
	fmt.Printf("==========================\n")
	samber.Sample()
	samber.Samples()
	samber.Shuffle()
	samber.Slice()
	samber.SliceToChannel()
	samber.SliceToMap()
	samber.Some()
	samber.SomeBy()
	samber.Subset()
	samber.Substring()
	samber.Sum()
	samber.SumBy()
	samber.Switch()
	fmt.Printf("==========================\n")
	samber.Ternary()
	samber.TernaryF()
	samber.Times()
	samber.ToAnySlice()
	samber.ToPtr()
	samber.ToSlicePtr()
	samber.Try()
	samber.TryCatch()
	samber.TryCatchWithErrorValue()
	samber.TryOr()
	samber.TryWithErrorValue()
	fmt.Printf("==========================\n")
	samber.Union()
	samber.Uniq()
	samber.UniqBy()
	samber.Unpack2()
	samber.Unzip2()
	fmt.Printf("==========================\n")
	samber.Values()
	samber.Validate()
	samber.ValueOr()
	fmt.Printf("==========================\n")
	samber.Without()
	samber.WithoutEmpty()
}

func recommend() {
	samber.Assign()    // 从第一个挨个拆出来 重复的话以最新的为准
	samber.Associate() // 对于数组可以二次处理形成对应的Map
	fmt.Printf("==========================\n")
	samber.BufferWithTimeout() // 对于管道拿指定个数组成Slice 可以设置超时
	fmt.Printf("==========================\n")
	samber.Chunk()         // 按照个数切割成子数组
	samber.Clamp()         // 超过范围就取上下界
	samber.Coalesce()      // 返回第一个非空参数 必须要可比性
	samber.Compact()       // 返回所有非零元素的切片
	samber.Contains()      // 是否存在
	samber.ContainsBy()    // 是否存在自定逻辑
	samber.Count()         // 计数
	samber.CountBy()       // 按照自己的逻辑进行技术
	samber.CountValues()   // 计数为Map
	samber.CountValuesBy() // 计数为Map按照自己的逻辑
	fmt.Printf("==========================\n")
	samber.Difference()                    // 排除两数组之间的并集
	samber.DispatchingStrategyRandom()     // 超过信道容量，将选择另一个随机信道
	samber.DispatchingStrategyRoundRobin() // 轮询选出非空信道
	samber.Drop()                          // 从左边数组丢掉指定个数
	samber.DropRight()                     // 从右边数组丢掉指定个数
	samber.DropRightWhile()                // 从右边数组丢掉指定逻辑
	samber.DropWhile()                     // 从左边数组丢掉指定逻辑
	fmt.Printf("==========================\n")
	samber.Every()   // 子集是否都在集合里面
	samber.EveryBy() // 按照自己的逻辑数组每个是否都符合要求
	fmt.Printf("==========================\n")
	samber.FanIn()            // 多个父管道吞吐到子管道里面
	samber.Filter()           // 类似与where
	samber.FilterMap()        // 比Filter多了个类似于可以在里面处理值
	samber.Find()             // 找数组满足的那一个值以及是否存在 比Contains高级点
	samber.FindDuplicates()   // 找出存在重复的值
	samber.FindDuplicatesBy() // 每个值做自己写的逻辑之后再取重复原值出来
	samber.FindIndexOf()      // 找第一个出现的值并得到值、下标、是否存在
	samber.FindKey()          // 根据Map的顺序来value反找最新的key
	samber.FindLastIndexOf()  // FindIndexOf相对找最新出现的
	samber.FindOrElse()       // 找不到给个默认值
	samber.FindUniques()      // 找到数组中只出现一次的
	samber.FindUniquesBy()    // 每个值做自己写的逻辑之后再取唯一的话将原值出来
	samber.FlatMap()          // 操作切片转并外一种切片
	samber.Flatten()          // 降维数组
	samber.ForEach()          // 遍历一遍
	samber.FromEntries()      // 满足断言则一口气转类型
	samber.FromEntries()      // 将键/值对数组转换为映射
	samber.FromPtrOr()        // 取指针下的值，nil则是默认值
	fmt.Printf("==========================\n")
	samber.GroupBy() // 分组 意思就是 GroupBy
	fmt.Printf("==========================\n")
	samber.IndexOf()       // 找第一次出现的下标 类似 Find、Contains
	samber.Interleave()    // 循环交替输入子切片
	samber.Intersect()     // 返回交集
	samber.Invert()        // key、value交换 以为主第一次
	samber.IsSortedByKey() // 按照自己的逻辑看是否满足顺序
	fmt.Printf("==========================\n")
	samber.KeyBy() // 根据数组的自己逻辑组建Map
	samber.Keys()  // 获取Map的Key
	fmt.Printf("==========================\n")
	samber.Last()        // 返回集合最后一个元素
	samber.LastIndexOf() // 返回数组中最后出现的值所在的索引
	fmt.Printf("==========================\n")
	samber.Map()        // 按照自己的逻辑处理数组并形成新的
	samber.MapEntries() // 操作Map映射项并将其转换为另一种类型的映射
	samber.MapKeys()    // 操作映射键并将其转换为另一种类型的映射
	samber.MapToSlice() // 按照自己的逻辑将Map转Slice
	samber.MapValues()  // 与 MapKeys 逻辑相仿
	samber.Max()        // 这几个不多介绍了
	samber.MaxBy()
	samber.Min()
	samber.MinBy()
	fmt.Printf("==========================\n")
	samber.None()   // 判断子集在不在父集
	samber.NoneBy() // 跟EveryBy相反
	samber.Nth()    // 类似Python从正负数取对应
	fmt.Printf("==========================\n")
	samber.OmitBy() // 根据逻辑进行Map的过滤删除
	samber.OmitByKeys()
	samber.OmitByValues()
	fmt.Printf("==========================\n")
	samber.PartitionBy() // 与OmitBy相反的逻辑 要啥取啥
	samber.PickBy()      // 挑选合适的Map
	samber.PickByKeys()
	samber.PickByValues()
	fmt.Printf("==========================\n")
	samber.Range() // 按顺序个数Range
	samber.RangeFrom()
	samber.RangeWithSteps()
	samber.Reduce() // Reduce 数组累计结果
	samber.ReduceRight()
	samber.Reject()   //  Filter 相反
	samber.Repeat()   //  重复N个初始化的值
	samber.RepeatBy() // 按照自己的逻辑Repeat
	samber.Replace()  // 返回的是副本 替换逻辑跟 .replace类似
	samber.ReplaceAll()
	samber.Reverse() // 翻转过来
	fmt.Printf("==========================\n")
	samber.SliceToChannel() // 数组转仅可读的管道
	samber.SliceToMap()     // 数组按照自己的逻辑转Map
	samber.Some()           // 子集至少有一个
	samber.SomeBy()         // 有一个满足逻辑就行
	samber.Subset()         //  数组偏移量加长度
	samber.Substring()      // 字符串偏移量加长度
	samber.Sum()            // 求和
	samber.SumBy()          // 按照逻辑求和
	fmt.Printf("==========================\n")
	samber.Ternary()                //  三元符
	samber.TernaryF()               // 函数的三元符
	samber.Times()                  //  i 从0开始
	samber.ToSlicePtr()             // 数组转指针数组
	samber.Try()                    // 判断函数执行后是否为err
	samber.TryCatchWithErrorValue() // 捕捉到错误且能把错误传到catch中
	samber.TryOr()                  // 错误的话返回默认值
	fmt.Printf("==========================\n")
	samber.Union()  // 联合返回给定集合中的所有不同元素，结果返回不会相对改变元素的顺序。
	samber.Uniq()   // 无重复版本，其中只保留每个元素的第一次出现。
	samber.UniqBy() // Uniq加上逻辑
	fmt.Printf("==========================\n")
	samber.Values()   // Map的value成数组
	samber.Validate() // 不满足则抛个错误
	samber.ValueOr()  // Map获取不到Key则返回一个默认值
	fmt.Printf("==========================\n")
	samber.Without()      // 数组剔除不想要的
	samber.WithoutEmpty() // 数组剔除数组中的空
}
